package cn.hy.redis.limiter;

import java.util.concurrent.TimeUnit;

/**
 * @author zhaomu
 */
public interface RateLimiter {

    /**
     * 等待直到获取1个令牌
     *
     * @return 等待时间
     */
    default long acquire() {
        return acquire(1);
    }

    /**
     * 等待直到获取指定数量的令牌
     *
     * @param permits 令牌数量
     * @return 等待时间
     */
    long acquire(int permits);

    /**
     * 最多等待【timeout】获取1个令牌
     *
     * @param timeout 获取令牌等待的时间，负数被视为0
     * @param unit    时间单位
     * @return true：获取成功；false：失败
     */
    default boolean tryAcquire(long timeout, TimeUnit unit) {
        return tryAcquire(1, timeout, unit);
    }

    /**
     * 最多等待【timeout】获取指定数量的令牌
     *
     * @param permits 要获取的令牌数
     * @param timeout 获取令牌等待的时间，负数被视为0
     * @param unit    时间单位
     * @return true：获取成功；false：失败
     */
    boolean tryAcquire(int permits, long timeout, TimeUnit unit);
}
